<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body>
    <script>
        let num = 10;
        let str = "aaa";
        let num2 = num;
        num2 = 20;
        console.log(num, num2);
        // 基本数据类型用=号直接复制复制的是值 是一个深拷贝

        // let arr = [1, 2, 3];
        // let arr2 = arr;
        // arr2[1] = "aa";
        // console.log(arr2, arr);
        // 引用数据类型用=号复制 复制的是地址 指向同一个内存 所以一个变了另一个也变 这种就叫浅复制

        // 引用数据类型最常用的是对象和数组 这两种我们分别讨论
        let arr = [1, 2, 3];
        // let arr2 = JSON.parse(JSON.stringify(arr));
        // let arr2 = arr.concat();
        let arr2 = [...arr];
        arr2[1] = "aa";
        console.log(arr2, arr);

        // 数组 深拷贝的方法
        // 1.可以用JSON.parse(JSON.stringify())
        // 2.concat
        // 3.展开运算符

        // 对象的深拷贝
        // 1.可以用JSON.parse(JSON.stringify())
        // 2.用递归实现

        let obj = {
            name: "小明",
            grande: [{
                title: "英语",
                gra: 100,
            }, {
                title: "数学",
                gra: [{
                    xueqi: "2210",
                    gra: 100,
                }, ],
            }, ],
        };
        // let obj2 = obj;//浅拷贝 指向同一个地址 一个变了另一个也变
        let obj2 = JSON.parse(JSON.stringify(obj));
        obj2.grande[0].gra = 200;
        console.log(obj2, obj);

        // 递归实现对象的深拷贝
        // 递归就是自身调用自身
        function deepcopy(obj) {
            let obj2 = {}; //保存拷贝之后的东西
            for (const key in obj) {
                // instanceof是判断数据类型的
                if (obj[key] instanceof Object) {
                    // console.log(obj[key]);
                    obj2[key] = deepcopy(obj[key]);
                    // console.log(obj2[key]);
                } else {
                    // console.log(obj[key]);
                    obj2[key] = obj[key];
                }
            }

            return obj2;
        }

        let data = {
            name: "小明",
            friend: {
                name: "小强",
            },
        };
        let data2 = deepcopy(data);
        //   第一次执行deepcopy
        //   循环的时候 第一次循环循环 name:小明 是一个基本数据类型 所以走else
        //    obj2={} obj2= {name:小明}
        //    第二次循环 循环friend obj2[friend]={name:"小强"}
        //     这个时候就要第二次调用 deepcopy 传的参数是data的frinnd
        //     obj2={
        //         name:"小明",
        //         friend:{name:"小强"}
        //     }

        // let obj3 = deepcopy(obj);
        // obj3.grande[0].gra = 200;
        // console.log(obj3, obj);
    </script>
</body>

</html>